BottleH Blog

프로세스와 스레드

    Tags

  • OS
프로세스와 스레드 thumbnail

프로세스와 스레드

우리가 흔히 개발하다보면, 멀티 프로세스, 멀티 스레드 등의 용어를 흔히 접할 수 있습니다. 저 또한 추상적으로(?) 이해만 하던 것을 명확하게 알기 위해서 정리해 보았습니다.

1. 프로세스

  • 실행 중인 프로그램

  • OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 실행됨

  • Code + Data + Heap + Stack 영역으로 이루어짐

    • Code : 실행 명령을 포함하는 코드들

    • Data : static 변수 혹은 global 변수

    • Heap : 동적 메모리 영역

    • Stack : 지역변수, 매개변수, 반환값 등 일시적인 데이터

2. 스레드

  • 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것
  • 가벼운 프로세스, 경량 프로세스라고 부르기도 함
  • 프로세스의 공유자원을 사용할 수 있음

2-1. 멀티 스레딩

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것, 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택PC 레지스터 값을 갖고 있다.

  • 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 즉, 독립된 실행 흐름을 갖기 위하여 스택을 가지고 있는 것
  • PC 레지스터 값은 스레드가 명령어의 어디까지 수행하였는지를 나타나게 된다. 스레드는 CPU 를 할당받았다가 스케줄러에 의해 다시 선점당한다. 그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다.

멀티 스레딩의 장점

  • 메모리 공간과 시스템 자원 소모가 줄어들게 된다.

  • 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 훨씬 간단하다

    • 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하여 데이터를 주고받을 수 있기 때문
  • 스레드의 context switch 는 프로세스 context switch 와는 달리 캐시 메모리를 비울 필요가 없기 때문에 더 빠르다.

  • 시스템의 throughput 이 향상되고 자원 소모가 줄어들며 프로그램의 응답 시간이 단축된다.

멀티 스레딩의 단점

  • 멀티 스레딩을 기반으로 프로그래밍할 때는 동일한 자원에 동시에 접근하는 것에 신경써줘야 한다.
    • 서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다.
    • 그래서, 동기화(Sync) 작업이 필요하다! => 이로 인해, 병목현상이 발생함.

3. 멀티 프로세스 vs 멀티 스레드

멀티 프로세스 멀티 스레드
독립적 긴밀하게 연결
IPC를 이용한 통신 공유된 자원으로 통신 비용 절감
자원 소모적, 개별 메모리 차지 공유된 자원으로 메모리가 효율적
컨텍스트 스위치 비용이 큼 컨텍스트 스위치 비용이 적음
동기화 작업이 필요 ❌ 공유 자원 관리 필요 ⭕️
프로세스 간 독립적이기 때문에 타 프로세스의 장애으로부터 독립적 한 쓰레드에서의 문제가 프로세스 전체에 영향을 줄 수 있음

✔ 구글 Chrome은 기본적으로 각각의 탭이 멀티 프로세스이다.

참고: Byrce님 블로그, 한재엽님 깃허브

Written by@BottleH
Back-End Developer

GitHub